home *** CD-ROM | disk | FTP | other *** search
/ By Popular Request 2.0 / By Popular Request 2.0 (Arsenal Computer).ISO / amiga_5 / pblcty14.lha / publicity.c < prev    next >
C/C++ Source or Header  |  1995-06-27  |  7KB  |  272 lines

  1. /*    "Publicity" PubScreen manager
  2.     V1.4 (27.06.95)
  3.     (L) 1995 Matthias Bethke
  4. */
  5.  
  6.  
  7. #include <proto/exec.h>
  8. #include <proto/dos.h>
  9. #include <proto/intuition.h>
  10. #include <proto/graphics.h>
  11. #include <proto/diskfont.h>
  12. #include <exec/memory.h>
  13. #include <dos/dostags.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16.  
  17. #define OPT_NAME ((STRPTR)ArgPtrs[0])
  18. #define OPT_WIDTH ((LONG*)ArgPtrs[1])
  19. #define OPT_HEIGHT ((LONG*)ArgPtrs[2])
  20. #define OPT_DEPTH ((LONG*)ArgPtrs[3])
  21. #define OPT_MODE ((UBYTE*)ArgPtrs[4])
  22. #define OPT_MODEID ((STRPTR)ArgPtrs[5])
  23. #define OPT_FONTNAME ((UBYTE*)ArgPtrs[6])
  24. #define OPT_FONTSIZE ((LONG*)ArgPtrs[7])
  25. #define OPT_CLOSE (ArgPtrs[8])
  26. #define OPT_DEFAULT (ArgPtrs[9])
  27. #define OPT_SHANGHAI (ArgPtrs[10])
  28. #define OPT_NOSHANGHAI (ArgPtrs[11])
  29. #define OPT_POPSCREEN (ArgPtrs[12])
  30. #define OPT_NOPOPSCREEN (ArgPtrs[13])
  31. #define OPT_TOFRONT (ArgPtrs[14])
  32. #define OPT_TOBACK (ArgPtrs[15])
  33.  
  34. #define CleanUp()    if(Args) FreeArgs(Args)
  35.  
  36. /* fuction protos */
  37. ULONG IDFromName(STRPTR Name);
  38.  
  39. /* globals */
  40. const char VersionString[]="$VER: Publicity V1.4 (27.06.95)";
  41.  
  42.  
  43. LONG main(char *argv[])
  44. {
  45. /* the string section */
  46. static char
  47. oserr_nomonitor[]        = "Selected monitor not available!\n",
  48. oserr_nochips[]        = "Your customchips can't display this mode!\n",
  49. oserr_nomem[]            = "Not enough memory for screen!\n",
  50. oserr_pubnotunique[]    = "The public screen name '%s' is already in use.\nChoose another name!\n",
  51. oserr_unknownmode[]    = "Unrecognizable screenmode!\n",
  52. oserr_toodeep[]        = "Your graphics hardware does not support screens with %d planes!\n",
  53. oserr_notavailable[]    = "Screenmode not available for unknown reasons!\n",
  54. default_screenerr[]    = "Unidentified error while opening screen!\n";
  55. static const UWORD PenArray[]={0,1,1,2,1,3,1,0,2,(UWORD)-1};
  56.  
  57. LONG ScreenError;
  58. struct Screen *PScreen;
  59. struct RDArgs *Args;
  60. struct TextAttr FontAttrib;
  61. LONG ArgPtrs[16]={0};
  62. static struct TagItem ScreenTags[12]=
  63. {
  64.     {SA_Top,            0},
  65.     {SA_Left,        0},
  66.     {SA_Width,        0},
  67.     {SA_Height,        0},
  68.     {SA_Depth,        0},
  69.     {SA_DisplayID,    0},
  70.     {SA_PubName,    0},
  71.     {SA_AutoScroll,TRUE},
  72.     {SA_Pens,        (ULONG)PenArray},
  73.     {SA_ErrorCode,    0},
  74.     {SA_SysFont,    TRUE},
  75.     {TAG_DONE,        0}
  76. };
  77.  
  78.     if(!(Args = ReadArgs("N=Name/A,W=Width/N,H=Height/N,D=Depth/N,M=Mode,MID=ModeID/K,F=Font/K,FS=FontSize/K/N,Close/S,Default/S,Shanghai/S,NoShanghai/S,PopScreen/S,NoPopScreen/S,ToFront/S,ToBack/S",ArgPtrs,NULL)))
  79.     {
  80.         PrintFault(IoErr(),NULL);
  81.         return RETURN_WARN;
  82.     }
  83.  
  84.     if(OPT_CLOSE)
  85.     {
  86. /* any option but "Name" is bogus when closing a screen :) */
  87.         if(
  88.             (ULONG)OPT_WIDTH |
  89.             (ULONG)OPT_HEIGHT |
  90.             (ULONG)OPT_DEPTH |
  91.             (ULONG)OPT_MODEID |
  92.             (ULONG)OPT_MODE |
  93.             OPT_SHANGHAI |
  94.             OPT_DEFAULT |
  95.             OPT_POPSCREEN |
  96.             OPT_TOBACK |
  97.             OPT_TOFRONT |
  98.             (ULONG)OPT_FONTNAME |
  99.             (ULONG)OPT_FONTSIZE
  100.             ) PutStr("?EXTRA IGNORED\n");
  101.         if(PScreen = LockPubScreen(OPT_NAME))
  102.         {
  103.             if(PScreen->FirstWindow == NULL)
  104.             {
  105.                 BOOL WasDefault;
  106.                 char DPSName[MAXPUBSCREENNAME+1];
  107.  
  108.                 GetDefaultPubScreen(DPSName);
  109.                 WasDefault = !strnicmp(DPSName,OPT_NAME,MAXPUBSCREENNAME);
  110.                 UnlockPubScreen(NULL,PScreen);
  111.                 if(!(CloseScreen(PScreen)))  PutStr("Cannot close screen, sorry!\n");
  112.                 CleanUp();
  113.                 if(WasDefault)    VPrintf("'%s' was the default public screen. Switched back to 'Workbench'!\n",(LONG*)&ArgPtrs[0]); /*OPT_NAME*/
  114.                 return RETURN_OK;
  115.             } else
  116.             {
  117.                 UnlockPubScreen(NULL,PScreen);
  118.                 PutStr("There are still windows open on the screen.\nPlease close them and try again!\n");
  119.                 CleanUp();
  120.                 return RETURN_WARN;
  121.             }
  122.         } else
  123.         {
  124.             VPrintf("Unable to find a screen called '%s'!\n",(LONG*)&ArgPtrs[0]);
  125.             CleanUp();
  126.             return 10;
  127.         }
  128.     }
  129.     if(
  130.         (ULONG)OPT_WIDTH |
  131.         (ULONG)OPT_HEIGHT |
  132.         (ULONG)OPT_DEPTH |
  133.         (ULONG)OPT_MODEID |
  134.         (ULONG)OPT_MODE
  135.         )
  136.     {
  137.         if(OPT_FONTNAME)
  138.         {
  139.             FontAttrib.ta_Name = OPT_FONTNAME;
  140.             FontAttrib.ta_YSize = OPT_FONTSIZE ? *OPT_FONTSIZE : 8;
  141.             FontAttrib.ta_Style = FS_NORMAL;
  142.             FontAttrib.ta_Flags = FPF_DISKFONT | FPF_PROPORTIONAL;
  143.             ScreenTags[10].ti_Tag    =    SA_Font;
  144.             ScreenTags[10].ti_Data    =    (ULONG)&FontAttrib;
  145.         }
  146. /* fill in the rest of TagList data */
  147.         if(!(OPT_WIDTH)) PutStr("Warning: No width specified!");
  148.         if(!(OPT_HEIGHT)) PutStr("Warning: No height specified!");
  149.         if(!(OPT_DEPTH)) PutStr("Warning: No depth specified!");
  150.         ScreenTags[2].ti_Data = OPT_WIDTH?*OPT_WIDTH>16?*OPT_WIDTH:16:16;
  151.         ScreenTags[3].ti_Data = OPT_HEIGHT?*OPT_HEIGHT>16?*OPT_HEIGHT:16:16;
  152.         ScreenTags[4].ti_Data = OPT_DEPTH?*OPT_DEPTH>0?*OPT_DEPTH:1:1;
  153.         ScreenTags[6].ti_Data = (ULONG)OPT_NAME;
  154.         ScreenTags[9].ti_Data = (ULONG)&ScreenError;
  155.         if(OPT_MODE) ScreenTags[5].ti_Data = IDFromName(OPT_MODE);
  156.         else if(OPT_MODEID)
  157.         {
  158.             sscanf(OPT_MODEID,"%ld",&(ScreenTags[5].ti_Data));
  159.         }
  160. /* open the screen */
  161.         if(PScreen = OpenScreenTagList(NULL,ScreenTags))
  162.         {
  163. /* make screen public */
  164.             PubScreenStatus(PScreen,0);
  165.         } else
  166.         {
  167.             char *ErrStr;
  168.             LONG Arg=0;
  169.             switch(ScreenError)
  170.             {
  171.  
  172.                 case    OSERR_NOMONITOR    :    ErrStr = oserr_nomonitor;
  173.                                                     break;
  174.                 case    OSERR_NOCHIPS        :    ErrStr = oserr_nochips;
  175.                                                     break;
  176.                 case    OSERR_NOCHIPMEM    :    /* fall through */
  177.                 case    OSERR_NOMEM            :    ErrStr = oserr_nomem;
  178.                                                     break;
  179.                 case    OSERR_PUBNOTUNIQUE:    ErrStr = oserr_pubnotunique;
  180.                                                     Arg = (LONG)OPT_NAME;
  181.                                                     break;
  182.                 case    OSERR_UNKNOWNMODE    :    ErrStr = oserr_unknownmode;
  183.                                                     break;
  184.                 case    OSERR_TOODEEP        :    ErrStr = oserr_toodeep;
  185.                                                     Arg = *OPT_DEPTH;
  186.                                                     break;
  187.                 case    OSERR_NOTAVAILABLE:    ErrStr = oserr_notavailable;
  188.                                                     break;
  189.                 default                        :    ErrStr = default_screenerr;
  190.                                                     break;
  191.             }
  192.             VPrintf(ErrStr,&Arg);
  193.             CleanUp();
  194.             return RETURN_FAIL;
  195.         }
  196.     }
  197.     if(PScreen = LockPubScreen(OPT_NAME))
  198.     {
  199.     UWORD ScreenFlags;
  200.  
  201.         if(OPT_DEFAULT) SetDefaultPubScreen(OPT_NAME);
  202.  
  203.          if(OPT_TOFRONT && OPT_TOBACK)
  204.             PutStr("Can only move screen to front OR to back!\n");
  205.         else
  206.         {
  207.             if(OPT_TOFRONT) ScreenToFront(PScreen);
  208.             if(OPT_TOBACK) ScreenToBack(PScreen);
  209.         }
  210.  
  211. /* get old screenflags... */
  212.         ScreenFlags = SetPubScreenModes(0);
  213.  
  214. /* ...modify them... */
  215.         if(OPT_SHANGHAI && OPT_NOSHANGHAI)
  216.                 PutStr("Wanna SHANGHAI or not?\n");
  217.             else
  218.             {
  219.                 if(OPT_SHANGHAI) ScreenFlags |= SHANGHAI;
  220.                 if(OPT_NOSHANGHAI) ScreenFlags &= ~SHANGHAI;
  221.             }
  222.     
  223.             if(OPT_POPSCREEN && OPT_NOPOPSCREEN)
  224.                 PutStr("Popeye...err...Popscreen?\n");
  225.             else
  226.             {
  227.                 if(OPT_POPSCREEN) ScreenFlags |= POPPUBSCREEN;
  228.                 if(OPT_NOPOPSCREEN) ScreenFlags &= ~POPPUBSCREEN;
  229.         }
  230.  
  231. /* ...and write them back! */
  232.         SetPubScreenModes(ScreenFlags);
  233.         UnlockPubScreen(NULL,PScreen);
  234.         CleanUp();
  235.         return RETURN_OK;
  236.     } else
  237.     {
  238.         VPrintf("Unable to find a screen called '%s'!\n",(LONG*)&ArgPtrs[0]); //OPT_NAME
  239.         CleanUp();
  240.         return RETURN_ERROR;
  241.     }
  242.  
  243. }
  244.  
  245. ULONG IDFromName(STRPTR Name)
  246. {
  247. ULONG DisplayID=INVALID_ID;
  248. DisplayInfoHandle DisplayHandle;
  249. struct NameInfo InfoBuf;
  250.  
  251. /* skip leading blanks */
  252.     Name = stpblk(Name);
  253.     
  254. /* scan all display IDs */
  255.     while((DisplayID = NextDisplayInfo(DisplayID)) != INVALID_ID)
  256.     {
  257.         DisplayHandle = FindDisplayInfo(DisplayID);
  258.  
  259. /* fill the InfoBuf structure with information about that ID */
  260.         if(GetDisplayInfoData(DisplayHandle,(UBYTE*)&InfoBuf,sizeof(InfoBuf),DTAG_NAME,0))
  261.         {
  262. /* - skip leading blanks on current monitor name
  263.     - compare function argument with monitor name
  264.     - if equal, return the associated DisplayID
  265.  */
  266.             if(stricmp(Name,stpblk(InfoBuf.Name)) == 0) return InfoBuf.Header.DisplayID;
  267.         }
  268.     }
  269.     PutStr("Screenmode name not found, using default!\n");
  270.     return 0;    
  271. }
  272.